package com.atguigu.common.util;

import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.Jwt;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.util.StringUtils;


import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.awt.*;
import java.security.Key;
import java.util.Date;

public class JwtUtils {
    //过期时间
    private static long tokenExpiration = 24*60*60*1000;
    //token 签名key
    private static String tokenSignKey = "A1t2g3uigu123456";

    public static Key getInstanceKey(){
        //加密方式
        SignatureAlgorithm hs256 = SignatureAlgorithm.HS256;

        byte[] bytes = DatatypeConverter.parseBase64Binary(tokenSignKey);

        SecretKeySpec secretKeySpec = new SecretKeySpec(bytes, hs256.getJcaName());

        return secretKeySpec;

    }

    public static String createToken(Long userId, String userName){

        /**
         *     private Header header; //头部
         *     private Claims claims; //声明
         *     private String payload; //载荷
         *     private SignatureAlgorithm algorithm; //签名算法
         *     private Key key; //签名key
         *     private byte[] keyBytes; //签名key的字节数组
         *     private CompressionCodec compressionCodec; //压缩算法
         *
         *     compact() 生成JWT
         *     signWith() 签名方法。两个参数分别是签名算法和自定义的签名Key（盐）。
         *     签名key可以byte[] 、String及Key的形式传入。前两种形式均存入builder的keyBytes属性，
         *     后一种形式存入builder的key属性。如果是第二种（及String类型）的key，则将其进行base64解码获得byte[] 。
         *
         */
        String token = Jwts.builder()  // 创建 JWT 对象
                //
                .setSubject("user token") // 设置主题（声明信息）
                //过期时间
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
                .claim("userId", userId)
                .claim("userName", userName)
                .signWith(SignatureAlgorithm.HS512, getInstanceKey())
                .compressWith(CompressionCodecs.GZIP)
                .compact();
        return token;
    }

    public static Boolean checkToken(String token){
        if(StringUtils.isEmpty(token)){
            return false;
        }
        try {
            Jwts.parser().setSigningKey(getInstanceKey()).parseClaimsJws(token);
            return true;
        }catch (Exception e){
            return false;
        }
    }
}
